a11y: Allow unsetting the relations using NULL
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 27 Jul 2020 12:53:05 +0000 (13:53 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Mon, 27 Jul 2020 13:26:19 +0000 (14:26 +0100)
Accessible values storing references and reference lists can be unset by
using NULL to mean "undefined"; since we cannot return the NULL value,
we need to intercept it when collecting a value, and replace it with an
undefined GtkAccessibleValue, which is also the value used as the
default for GtkAccessibleRelation values that store a reference or a
reference list.

Fixes: #2955
gtk/gtkaccessiblevalue.c

index 21d9ae741a687f72b58ca6ca7a3dca352e1319a6..081bbf700a71bec34fedf67d8bd3dc1b05628ad8 100644 (file)
@@ -1047,10 +1047,20 @@ gtk_accessible_value_collect_valist (const GtkAccessibleCollect *cstate,
 
         gpointer value = va_arg (*args, gpointer);
 
-        if (ctor == NULL)
-          res = gtk_reference_accessible_value_new (value);
+        if (value == NULL)
+          {
+            if (ctor == NULL)
+              res = gtk_undefined_accessible_value_new ();
+            else
+              res = (* ctor) (value);
+          }
         else
-          res = (* ctor) (value);
+          {
+            if (ctor == NULL)
+              res = gtk_reference_accessible_value_new (value);
+            else
+              res = (* ctor) (value);
+          }
       }
       break;
 
@@ -1061,10 +1071,20 @@ gtk_accessible_value_collect_valist (const GtkAccessibleCollect *cstate,
 
         GList *value = va_arg (*args, gpointer);
 
-        if (ctor == NULL)
-          res = gtk_reference_list_accessible_value_new (value);
+        if (value == NULL)
+          {
+            if (ctor == NULL)
+              res = gtk_undefined_accessible_value_new ();
+            else
+              res = (* ctor) (value);
+          }
         else
-          res = (* ctor) (value);
+          {
+            if (ctor == NULL)
+              res = gtk_reference_list_accessible_value_new (value);
+            else
+              res = (* ctor) (value);
+          }
       }
       break;